package ejb.cbm.seguridad.session;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;

import javax.persistence.EntityManager;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Service;

import ejb.cbm.commons.JdbcHelper;
import ejb.cbm.seguridad.entity.OpcionEntity;
import ejb.cbm.seguridad.local.OpcionSessionLocal;

////@Stateless
@Service("opcionSessionLocal")
public class OpcionSession extends HibernateDaoSupport implements OpcionSessionLocal {
	
	static Logger logger = Logger.getLogger(OpcionSession.class.getName());
	//property constants
	public static final String TEXTO = "texto";
	public static final String TIPO = "tipo";
	public static final String ORDEN = "orden";
	public static final String DESCRIPCIONOPCION = "descripcionopcion";
	public static final String CODIGOPADRENIVEL1 = "codigopadrenivel1";
	public static final String CODIGOPADRENIVEL2 = "codigopadrenivel2";
	public static final String FLAGACTIVO = "flagactivo";
	public static final String USUARIOREGISTRO = "usuarioregistro";
	public static final String USUARIOMODIFICACION = "usuariomodificacion";


    //@PersistenceContext 
    //private EntityManager entityManager;
	
	@Autowired
	public OpcionSession(SessionFactory sessionFactory){
		super.setSessionFactory(sessionFactory);
	}
	
    public void save(OpcionEntity transientInstance) {
    	logger.log("saving OpcionEntity instance", Level.INFO, null,null);
        try {
            getSession().persist(transientInstance);
            logger.log("save successful", Level.INFO, null,null);
        } catch (RuntimeException re) {
        	logger.log("save failed", Level.FATAL,null, re);
            throw re;
        }
    }
    
    public void delete(OpcionEntity persistentInstance) {
    	logger.log("deleting OpcionEntity instance", Level.INFO, null,null);
        try {
            getSession().delete(persistentInstance);
            logger.log("delete successful", Level.INFO, null,null);
        } catch (RuntimeException re) {
        	logger.log("delete failed", Level.FATAL,null, re);
            throw re;
        }
    }
    
    public OpcionEntity update(OpcionEntity detachedInstance) {
    	logger.log("updating OpcionEntity instance", Level.INFO, null,null);
        try {
            OpcionEntity result = (OpcionEntity) getSession().merge(detachedInstance);
            logger.log("update successful", Level.INFO, null,null);
            return result;
        } catch (RuntimeException re) {
        	logger.log("update failed", Level.FATAL,null, re);
            throw re;
        }
    }
    
    public OpcionEntity findById( Long id) {
    	logger.log("finding OpcionEntity instance with id: " + id, Level.INFO, null,null);
        try {
            OpcionEntity instance = (OpcionEntity) getSession().get(OpcionEntity.class, id);
            return instance;
        } catch (RuntimeException re) {
        	logger.log("find failed", Level.FATAL,null, re);
            throw re;
        }
    }
    
    //@SuppressWarnings("unchecked")
    public List<OpcionEntity> findByProperty(String propertyName, Object value) {
    	logger.log("finding OpcionEntity instance with property: " + propertyName
    						+ ", value: " + value, Level.INFO, null,null);
		try {
			String queryString = "select model from OpcionEntity model where model." 
			 						+ propertyName + "= :propertyValue";
			return getSession().createQuery(queryString)
 				.setParameter("propertyValue", value).list();
		} catch (RuntimeException re) {
			logger.log("find by property name failed", Level.FATAL,null, re);
			throw re;
		}
	}
	
	public List<OpcionEntity> findByTexto(Object texto) {
		return findByProperty(TEXTO, texto);
	}
	
	public List<OpcionEntity> findByTipo(Object tipo) {
		return findByProperty(TIPO, tipo);
	}
	
	public List<OpcionEntity> findByOrden(Object orden) {
		return findByProperty(ORDEN, orden);
	}
	
	public List<OpcionEntity> findByDescripcionopcion(Object descripcionopcion) {
		return findByProperty(DESCRIPCIONOPCION, descripcionopcion);
	}
	
	public List<OpcionEntity> findByCodigopadrenivel1(Object codigopadrenivel1) {
		return findByProperty(CODIGOPADRENIVEL1, codigopadrenivel1);
	}
	
	public List<OpcionEntity> findByCodigopadrenivel2(Object codigopadrenivel2) {
		return findByProperty(CODIGOPADRENIVEL2, codigopadrenivel2);
	}
	
	public List<OpcionEntity> findByFlagactivo(Object flagactivo) {
		return findByProperty(FLAGACTIVO, flagactivo);
	}
	
	public List<OpcionEntity> findByUsuarioregistro(Object usuarioregistro) {
		return findByProperty(USUARIOREGISTRO, usuarioregistro);
	}
	
	public List<OpcionEntity> findByUsuariomodificacion(Object usuariomodificacion) {
		return findByProperty(USUARIOMODIFICACION, usuariomodificacion);
	}
	

	//@SuppressWarnings("unchecked")
	public List<OpcionEntity> findAll() {
		logger.log("finding all OpcionEntity instances", Level.INFO, null,null);
		try {
			String queryString = "select model from OpcionEntity model";
			return getSession().createQuery(queryString).list();
		} catch (RuntimeException re) {
			logger.log("find all failed", Level.FATAL,null, re);
			throw re;
		}
	}
	
	public String obtieneRutaMenu(Connection con, Long codigoOpcion) throws SQLException{
		
		Statement st = null;
		ResultSet rs = null;
		StringBuilder sb = new StringBuilder();
		String rutaMenu = "";
		
		sb.append(" select ");
		sb.append(" continuidad.pq_continuidad.f_obtener_ruta_menu("+codigoOpcion+") rutamenu ");
		sb.append(" from dual");
		
		try{
			
			st = con.createStatement();
			rs = st.executeQuery(sb.toString());
			
			while(rs.next()){
				rutaMenu = rs.getString("rutamenu");
			}
			
		}finally{
			JdbcHelper.close(null, null, null, st, rs);
		}
		
		return rutaMenu;
	}
}